package com.amethyst.mybatisplus.generator;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import com.baomidou.mybatisplus.generator.fill.Column;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

/**
 * 3.5.1+版本的代码生成器
 * @author Amethyst
 * @date 2021/11/11
 */
public class FastCodeGenerator {

    /**
     * 数据源配置
     * @return DataSourceConfig.Builder
     */
    private DataSourceConfig.Builder dataSourceConfig() {
        return new DataSourceConfig.Builder("jdbc:mysql://localhost:3306/test?userUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai",
                "root", "123456");
    }

    public void generate() {
        FastAutoGenerator.create(dataSourceConfig())
                // 全局配置
                .globalConfig(builder ->
                    builder.author("amethyst") // 设置作者
                            .disableOpenDir() // 生成结束后不打开文件夹
                            .fileOverride() // 覆盖已生成文件
                            .enableSwagger() // 开启swagger模式
                            .dateType(DateType.ONLY_DATE) // 实体类中的日期类型
                            .outputDir(System.getProperty("user.dir") + "/mybatis-plus/src/main/java") // 生成文件路径
                )
                // 包配置
                .packageConfig((scanner, builder) ->
                    builder.parent("com.amethyst.mybatisplus.generator") //父包名
                            .moduleName(scanner.apply("请输入模块名: ")) // 父包模块名
                            .entity("model") // 实体类包名
                )
                // 模板配置 设置controller模板路径
                .templateConfig(builder -> builder.controller("templates/controller.java"))
                // 策略配置
                .strategyConfig((scanner, builder) ->
                    builder.addInclude(getTables(scanner.apply("请输入表名，多个英文符号分割？所有请输入 all"))) // 设置需要生成的表名
                            .addTablePrefix("mp_") // 设置过滤表前缀
                            .controllerBuilder() // 1.controller策略配置
                            .enableRestStyle() // 开启@RestController控制器
                            .enableHyphenStyle() // 开启驼峰转连字符
                            .entityBuilder() // 2.实体策略配置
                            .enableLombok() // 开启lombok
                            .disableSerialVersionUID() // 不生成serialVersionUID
                            .idType(IdType.AUTO) // 全局主键类型
                            .enableChainModel() // 开启链式模式
                            .naming(NamingStrategy.underline_to_camel) // 下划线驼峰命名转换
                            .columnNaming(NamingStrategy.underline_to_camel)  // 字段下划线驼峰命名转换
                            .addTableFills( // 添加表字段填充
                                    new Column("create_time", FieldFill.INSERT),
                                    new Column("update_time", FieldFill.UPDATE)
                            )
                            .serviceBuilder() // 3. Service策略配置
                            .formatServiceFileName("%sService")
                )
                // 模板引擎设置
                .templateEngine(new FreemarkerTemplateEngine())
                // 执行
                .execute();
    }

    /**
     * 处理输入要生成的表名
     * @param tables tables
     * @return List<String>
     */
    private static List<String> getTables(String tables) {
        return "all".equals(tables) ? Collections.emptyList() : Arrays.asList(tables.split(","));
    }

    public static void main(String[] args) {
        FastCodeGenerator generator = new FastCodeGenerator();
        generator.generate();
    }
}
